/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pooproj.regra;

import java.util.ArrayList;
import pooproj.basica.Locacao;
import pooproj.erro.AllgemeinException;
import pooproj.erro.ConexaoException;
import pooproj.erro.ConsultaException;
import pooproj.repositorio.RepositorioLocacao;
import pooproj.repositorio.RepositorioLocacaoImpl;

/**
 *
 * @author Daniella
 */
public class RNLocacao {
    
    private RepositorioLocacao rep;
    
    public RNLocacao() {
        rep = new RepositorioLocacaoImpl();
    }
    
    /**
     * Valida preenchimento correto de campos
     * @param l
     * @throws AllgemeinException
     */
    public void valida(Locacao l) throws AllgemeinException{
        if(l.getValida()!=null){
            throw new AllgemeinException("emptyfield",l.getValida());
        }
        
        if(l.getDtLoc().trim().length()!=10){
            throw new AllgemeinException("invalidvalue");
        }
    }
    
    /**
     * insere registro no bd
     * @param l
     * @throws AllgemeinException
     */
    public void cadastra(Locacao l) throws AllgemeinException{
        try{
            rep.inserir(l);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
    
    
    
    /**
     * verifica se Locacao existe a partir do cod locacao
     * @param l
     * @throws AllgemeinException
     */
    public void verificaExiste(Locacao l) throws AllgemeinException{
        if(consultaCodLoc(l.getCodLoc())==null){
            throw new AllgemeinException("notfound");
        }
    }
    
    /**
     * consulta locacao a partir do codigo do cliente
     * @param cod
     * @return Locacao
     * @throws AllgemeinException
     */
    public Locacao consultaCodCliente(int cod) throws AllgemeinException{
        Locacao l;
        try{
            l = rep.consultarCodCliente(cod); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return l;
    }
    
    /**
     * consulta locacao a partir do cod locacao
     * @param cod
     * @return Locacao
     * @throws AllgemeinException
     */
    public Locacao consultaCodLoc(int cod) throws AllgemeinException{
        Locacao l;
        try{
            l = rep.consultarCodLoc(cod); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return l;
    }
    
    /**
     * consulta locacao a partir da data locacao
     * @param data
     * @return Locacao
     * @throws AllgemeinException
     */
    public Locacao consultaDtLoc(String data) throws AllgemeinException{
        Locacao l;
        try{
            l = rep.consultarDtLoc(data); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return l;
    }
   
      /**
     * consulta locacao a partir da data devolucao
     * @param data
     * @return Locacao
     * @throws AllgemeinException
     */
    public Locacao consultaDtDevol(String data) throws AllgemeinException{
        Locacao l;
        try{
            l = rep.consultarDtDevol(data); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return l;
    }
   
      /**
     * consulta para retornar cod locacao a partir da dt loc, dt devol e cod cliente
     * @param dtLoc
     * @param dtDevol
     * @param codCliente
     * @return int
     * @throws AllgemeinException
     */
    public int consultaTudo(String dtLoc, String dtDevol, int codCliente) throws AllgemeinException{
        int i;
        try{
            i = rep.consultarTudo(dtLoc, dtDevol, codCliente); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return i;
    }
      
    /**
     * altera registro de locacao no bd
     * @param l
     * @throws AllgemeinException
     */
    public void altera(Locacao l) throws AllgemeinException{
        try{
            rep.alterar(l);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
    
    /**
     * lista todos os registros de locacao
     * @return ArrayList
     * @throws AllgemeinException
     */
    public ArrayList<Locacao> lista() throws AllgemeinException{
        ArrayList<Locacao> list;
        try{
            list = rep.listar();
            
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return list;
    }
    
    /**
     * exclui registro de locacao
     * @param l
     * @throws AllgemeinException
     */
    public void exclui(Locacao l) throws AllgemeinException{
        try{
            rep.excluir(l);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
    
}
